package com.yunkeji.common.enums.app;

import com.yunkeji.common.exception.AppServiceException;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.Optional;

/**
 * 通话状态（0：等待接通，1：正在通话，2：主叫挂断，3：被叫挂断，4：接听超时，5：被叫忙碌，6：系统挂断），默认值为0
 *
 * @author yunkeji
 */
@Getter
@AllArgsConstructor
public enum CallSheetStatus {
    等待接通(0),
    // 1：未接通主叫挂断 2：未接通被叫挂断 3：接听超时 4：被叫忙碌 5：未接通系统挂断 6：已接通主叫挂断 7：已接通被叫挂断 8：已接通系统挂断
    未接通主叫挂断(1),
    未接通被叫挂断(2),
    接听超时(3),
    被叫忙碌(4),
    未接通系统挂断(5),
    已接通主叫挂断(6),
    已接通被叫挂断(7),
    已接通系统挂断(8),

    正在通话(9);
    private final Integer code;

    /**
     * 判断呼叫状态是否为未接听或挂断
     *
     * @param sheetStatus 呼叫单状态，包含了呼叫的当前状态代码
     * @return 如果呼叫状态为未接通主叫挂断、未接通被叫挂断、被叫忙碌、未接通系统挂断或接听超时，返回true；否则返回false
     * @author 老张
     */
    public static boolean isCallCancel(CallSheetStatus sheetStatus) {
        // 判断呼叫状态代码是否为预定义的未接听或挂断状态
        return sheetStatus.getCode().equals(CallSheetStatus.未接通主叫挂断.getCode())
                || sheetStatus.getCode().equals(CallSheetStatus.未接通被叫挂断.getCode())
                || sheetStatus.getCode().equals(CallSheetStatus.被叫忙碌.getCode())
                || sheetStatus.getCode().equals(CallSheetStatus.未接通系统挂断.getCode())
                || sheetStatus.getCode().equals(CallSheetStatus.接听超时.getCode());
    }

    public static CallSheetStatus getByCode(Integer code) {
        CallSheetStatus[] values = CallSheetStatus.values();
        Optional<CallSheetStatus> first =
                Arrays.stream(values).filter(item -> item.getCode().equals(code)).findFirst();
        if (first.isPresent()) {
            return first.get();
        } else {
            throw AppServiceException.paramException("话单参数异常");
        }
    }

    /**
     * 判断通话状态是否为已接通后挂断
     *
     * <p>此方法用于根据传入的通话状态对象判断通话是否曾经接通并已挂断 通过比较通话状态码来确定是否满足条件
     *
     * @param sheetStatus 通话状态对象，包含通话状态码
     * @return 如果通话状态为已接通主叫挂断、已接通被叫挂断或已接通系统挂断，则返回true；否则返回false
     * @author 老张
     */
    public static boolean isAnswerCancel(CallSheetStatus sheetStatus) {
        // 判断通话状态码是否为已接通主叫挂断、已接通被叫挂断或已接通系统挂断
        return sheetStatus.getCode().equals(CallSheetStatus.已接通主叫挂断.getCode())
                || sheetStatus.getCode().equals(CallSheetStatus.已接通被叫挂断.getCode())
                || sheetStatus.getCode().equals(CallSheetStatus.已接通系统挂断.getCode());
    }
}
